package com.xueqiu.movieplaymanagersystem.utils;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * @author xueqiu
 */
@Slf4j
public class KeyUtils {
    /**
     * 解密；对RSA加密的BASE64格式的密文密码进行解密
     * @param password BASE64格式密文密码
     * @param publicKey 公钥
     * @param redisTemplate REDIS工具对象
     * @return 明文密码
     */
    public static String checkPassword(String password, String publicKey, StringRedisTemplate redisTemplate) {
        // publicKey需要前端返回
        String privateKey = redisTemplate.opsForValue().get(publicKey);
        if (privateKey == null) {
            return null;
        }
        log.info("KeyUtils privateKey ---> {}",privateKey);
        // 获取到私钥之后，需要将redis中的该公钥私钥对信息移除
        redisTemplate.opsForValue().getOperations().delete(publicKey);
        // 构建，当只用私钥进行构造对象时，只允许使用该私钥进行加密和解密操作，这里只需要进行私钥解密，故只使用私钥构造对象
        RSA rsa = new RSA(privateKey, null);
        // 密码的密文先进行base64解码，之后再进行rsa解密
        byte[] decrypt = rsa.decrypt(Base64.decode(password), KeyType.PrivateKey);
        String plainPassword = StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8);
        log.info("KeyUtils plainPassword ---> {}",plainPassword);
        return plainPassword;
    }

    /**
     * 解密；对RSA加密的BASE64格式的密文密码进行解密；没有删除REDIS中的私钥
     * @param password BASE64格式密文密码
     * @param publicKey 公钥
     * @param redisTemplate REDIS工具对象
     * @return 明文密码
     */
    public static String checkPasswordNotDeletePrivateKey(String password, String publicKey, StringRedisTemplate redisTemplate) {
        String privateKey = redisTemplate.opsForValue().get(publicKey);
        if (privateKey == null) {
            return null;
        }
        log.info("KeyUtils privateKey ---> {}",privateKey);
        RSA rsa = new RSA(privateKey, null);
        byte[] decrypt = rsa.decrypt(Base64.decode(password), KeyType.PrivateKey);
        String plainPassword = StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8);
        log.info("KeyUtils plainPassword ---> {}",plainPassword);
        return plainPassword;
    }
}
